package structuresManagers;

import java.io.IOException;

import bplustree.BPlusTree;
import bplustree.BadChecksumException;
import register.Register;
import register.RegisterID;
import FilesManagers.CantOpenFileException;
import Filters.FullFilter;

public class BplusTreeManager extends AbstractManager {

	private BPlusTree arbol;
	private boolean exactSearch;
	
	public BplusTreeManager(String urls, String urlsProcesadas,
			FullFilter filtro) throws CantOpenFileException {
		super(urls, urlsProcesadas, filtro);
		// TODO Apéndice de constructor generado automáticamente
	}

	@Override
	protected void inMakeStructure(Register registro) throws IOException, BadChecksumException {
		// TODO Apéndice de método generado automáticamente
		arbol.insert(registro);
	}

	@Override
	protected Register inSearch(String objetivo) throws IOException, BadChecksumException {
		// TODO Apéndice de método generado automáticamente
		String entrada=filtro.procesarSearch(objetivo);
		return arbol.search(new RegisterID(entrada),exactSearch);
	}

	@Override
	protected void buildStructure(String archivo, Integer structureSize) throws IOException, CantOpenFileException {
		// TODO Apéndice de método generado automáticamente
		arbol = new BPlusTree(archivo,structureSize); 
		
	}
	
	public void makeNewIndex(String archArbol, Integer nodeSize) throws CantOpenFileException{
		super.makeNewStructure(archArbol, nodeSize);
	}
	public void makeIndex(String archArbol, Integer nodeSize) throws CantOpenFileException{
		super.makeStructure(archArbol, nodeSize);		
	}
	public String[] searchIndex(String archArbol,String objetivo) throws CantOpenFileException{
		return super.search(archArbol, objetivo);
	}
	public void listIndex(String archArbol) throws CantOpenFileException{		
		try {
			arbol = new BPlusTree(archArbol,128);//el 128 es dummy, el archivo contiene el nodeSize
			arbol.list();
		} catch (IOException e) {
			throw new CantOpenFileException("Error al cargar el arbol");
			
		} 
	}

	@Override
	protected void inMakeStructureUrlFinished() {
		// TODO Apéndice de método generado automáticamente
		
	}

	public void setExactSearch(boolean exactSearch) {
		//arbol.setExactSearch(exactSearch);
		this.exactSearch=exactSearch;
	}

}
